#region Copyright Notice

// 
// 
//  
//  Copyright (c) 2009-2011 Anindya Chatterjee
//  
//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at
//  
//      http://www.apache.org/licenses/LICENSE-2.0
//  
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
// 
// 

#endregion

using System;
using System.IO;
using System.Security.Cryptography;
using AbstractClass.Security.Cryptography;

namespace AbstractClass.IO
{
    internal class ChecksumCalculator
    {
        internal static string GetChecksum(Stream stream, ChecksumType checksumType)
        {
            if (stream == null || stream.Length == 0)
                throw new ArgumentException(LanguageResource.ChecksumEmptyStream, "stream");

            var bs = new BufferedStream(stream, 1200000);
            string hashString;
            switch (checksumType)
            {
                case ChecksumType.CRC32:
                    using (var crc32 = new Crc32())
                    {
                        uint crcHash = crc32.ComputeHash(bs);
                        hashString = crcHash.ToString("X2");
                    }
                    break;
                case ChecksumType.MD5:
                    using (var m5 = new MD5CryptoServiceProvider())
                    {
                        byte[] hash = m5.ComputeHash(bs);
                        hashString = BitConverter.ToString(hash).Replace("-", "");
                    }
                    break;
                case ChecksumType.SHA1:
                    using (var sha = new SHA1Managed())
                    {
                        byte[] checksum = sha.ComputeHash(bs);
                        hashString = BitConverter.ToString(checksum).Replace("-", String.Empty);
                    }
                    break;
                default:
                    throw new ArgumentOutOfRangeException("checksumType");
            }
            stream.Position = 0;
            return hashString;
        }
    }
}